
package Controlador.Componentes;

import Comun.LabelObjetivo;
import Controlador.Controladores.FuenteTabla;
import Controlador.Interfaz.DataFuente;
import java.awt.Color;
import java.sql.SQLException;
import java.util.Observable;
import java.util.Observer;
import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JTextField;


public final class TextFieldFuente extends JTextField implements DataFuente, Observer{
    //Propiedades   del Objeto
    private boolean Llave=false;
    private String Campo="";
    private String[] Tipo={"Texto","Numerico","Boleano"};
    private FuenteTabla tbl =null;
    private int  ValidacionExp=0; 
    private String mensaje="";
    private int[] extremos= new int[2];
    private LabelObjetivo objetivo=null;
    private boolean AutoNumerico;
    //Otros Objetos de la Clase
   
    //Constructores
    
    public TextFieldFuente(){
        extremos[0]=5; extremos[1]=45;
        this.setInputVerifier(new InputVerifier() {
            
            @Override
            public boolean verify(JComponent jc) {
                mensaje ="";
                objetivo.setText(mensaje);
                if(!(getText().trim().isEmpty()))
                    if(getText().length()>=getExtremos()[0] && getText().length()<=getExtremos()[1])
                    switch (getValidacionExp()) {
                        case 0:
                            try{
                                Float.parseFloat(getText());
                            }catch (NumberFormatException ex) {
                                mensaje="El campo solo Acepta Numeros.";
                                 objetivo.setText(mensaje);
                                setBackground(Color.PINK);
                                
                                return false;
                            }
                            break;
                        case 1:
                            try{
                                Integer.parseInt(getText());
                            }catch (NumberFormatException ex) {
                                mensaje="El campo solo Acepta Numeros.";
                                 objetivo.setText(mensaje);
                                setBackground(Color.PINK);
                                return false;
                            }
                            break;
                        case 2:
                           String cade= getText().trim().replace(" ", "");
                            for (int x : cade.toCharArray()) {
                                if(x>64 && x<91 || x>167 || x<170);
                                else 
                                if(x>96 && x<123);
                                else{
                                    mensaje="El campo solo acepta Letras";
                                     objetivo.setText(mensaje);
                                    setBackground(Color.PINK);
                                    return false;
                                }
                                }   

                            break;
                        default:
                            setBackground(Color.WHITE);
                             objetivo.setText("");
                            return true;
                }
                    else {
                        mensaje="El campo debe contener entre "+getExtremos()[0]+" y "+getExtremos()[1]+" carecteres";
                         objetivo.setText(mensaje);
                        setBackground(Color.PINK);
                        return false;
                    }
                
                        
                else{
                    mensaje="El Campo no debe estar Vacio.";
                     objetivo.setText(mensaje);
                    setBackground(Color.PINK);
                    return false;
                }
                grabFocus();
                setBackground(Color.WHITE);
                return true;
            }

        });
        
    }
    
     //metodos
    @Override
    public void update(Observable o, Object o1) {
        try {
            System.out.println(this.getTbl().getRs().getString(this.getCampo()));
            this.setText(this.getTbl().getRs().getString(this.getCampo()));
        } catch (SQLException ex) {
            this.setText("");
        }
        
    }
    
    
    @Override
    public boolean validar(){
        return this.getInputVerifier().verify(this);
    }
    
    public String Mensaje(){ 
        return mensaje;
    }
    

      //Geters y Seters
    @Override
    public boolean isLlave() {
        return(Llave);
    }
    
    public void setLlave(boolean Llave){
        this.Llave=Llave;
    }

  
    public FuenteTabla getTbl() {
        return tbl;
    }

    
    public void setTbl(FuenteTabla tbl) {
        this.tbl = tbl;
        if(tbl!=null){
            this.getTbl().addObserver(this);
            this.getTbl().getLstObservadores().add(this);
        }
    }

    @Override
    public String getCampo() {
        return(Campo);
    }


    @Override
    public String getTipoSeleccionado() {
       return(getTipo()[0]);
    }


    public String[] getTipo() {
        return Tipo;
    }


    public void setCampo(String Campo) {
        this.Campo = Campo;
    }


    public void setTipo(String[] Tipo) {
        this.Tipo = Tipo;
    }

    /**
     * @return the ValidacionExp
     */
    public int getValidacionExp() {
        return ValidacionExp;
    }

    /**
     * @param ValidacionExp the ValidacionExp to set
     */
    public void setValidacionExp(int ValidacionExp) {
        this.ValidacionExp = ValidacionExp;
    }

    /**
     * @return the extremos
     */
    public int[] getExtremos() {
        return extremos;
    }

    /**
     * @param extremos the extremos to set
     */
    public void setExtremos(int[] extremos) {
        this.extremos = extremos;
    }

    @Override
    public boolean valor() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    /**
     * @return the objetivo
     */
    public LabelObjetivo getObjetivo() {
        return objetivo;
    }

    /**
     * @param objetivo the objetivo to set
     */
    public void setObjetivo(LabelObjetivo objetivo) {
        this.objetivo = objetivo;
    }

    @Override
    public void Limpiar() {
        this.setText("");
    }

    @Override
    public void setText(String string) {
        super.setText(string);
        firePropertyChange(string, ui, ui);
    }
    
    
    
     @Override
    protected void firePropertyChange(String string, Object o, Object o1) {
        super.firePropertyChange(string, o, o1);
       if(this.getParent()!=null) this.getParent().getParent().repaint();
    }

    @Override
    public boolean isAutoNumerico() {
        return this.AutoNumerico;
    }

    /**
     * @param AutoNumerico the AutoNumerico to set
     */
    public void setAutoNumerico(boolean AutoNumerico) {
        this.AutoNumerico = AutoNumerico;
    }


    
}
